Линейные программы это конечно хорошо, и многие вычисления отлично укладываются в эту модель. Но многие - не укладываются. Например, при решении квадратного уравнения нужно отдельно обработать случай отрицательного дискриминанта.
(70%)NaN – не число
А что, кстати, получится, если не проверить что дискриминант меньше нуля?
Попробуем:
#include <math.h>#include <stdio.h>int main(void){double x =-2, y, z;
y=sqrt(x);
z=2*y+x/2;printf("\n %f %f %f",x,y,z);return0;}
результат
-2.000000 -1.#IND00 -1.#IND00
Мы видим, что никакого сообщения об ошибке не появилось, но в результате вычисления корня возникло "что-то странное" (y), при этом при использовании в выражении оно превращает результат в себя (распространяется по выражению) (z)!
Это "странное" означает неопределенный результат, NaN (расшифровывается как not a number – не число).
"Распространение по выражению" достаточно логично: если у нас по ходу вычисления получилось "не число", результат смысла не имеет.
Для решения подобного класса проблем есть несколько управляющих операторов, позволяющих менять путь выполнения программы. Кстати, чтобы наглядно представить путь выполнения программы, очень удобно использовать блок-схемы.
А что, кстати, получится, если не проверить что дискриминант меньше нуля?
Попробуем:
результат
Мы видим, что никакого сообщения об ошибке не появилось, но в результате вычисления корня возникло "что-то странное" (y), при этом при использовании в выражении оно превращает результат в себя (распространяется по выражению) (z)!
Это "странное" означает неопределенный результат, NaN (расшифровывается как not a number – не число).
"Распространение по выражению" достаточно логично: если у нас по ходу вычисления получилось "не число", результат смысла не имеет.
Для решения подобного класса проблем есть несколько управляющих операторов, позволяющих менять путь выполнения программы. Кстати, чтобы наглядно представить путь выполнения программы, очень удобно использовать блок-схемы.